4.3.0 概述
为 ViewGroup 内的组件添加动画,Android 共提供了 4 种方法。
1. layoutAnimation 标签与 LayoutAnimationController
第一:定义一个 layoutAnimation 的 animation 文件,如:(anim/layout_animation.xml)
第二步:在 viewGroup 类型的控件中,添加 android:layoutAnimation=”@anim/layout_animation”,如:
其中 @anim/slide_in_left 文件:
注意:android:layoutAnimation 只在 ViewGroup 创建的时候,才会对其中的 item 添加动画。在创建成功以后,再向其中添加 item 将不会再有动画。
2. gridLayoutAnimation 标签与 GridLayoutAnimationController
gridLayoutAnimation 与 layoutAnimation 一样有缺陷:即在 GridView 初次创建的时候有入场动画,之后新添加的数据是不会有入场动画的。
详情请点击前往:layoutAnimation & gridLayoutAnimation
3. animateLayoutChanges 属性
在 API 11 之后,Android 为了支持 ViewGroup 类控件,在添加和移除其中控件时自动添加动画,为我们提供了一个非常简单的属性:android:animateLayoutChanges=[true/false],所有派生自 ViewGroup 的控件都具有此属性,只要在 XML 中添加上这个属性,就能实现添加/删除其中控件时,带有默认动画了。
4. LayoutTransition
在 API 11 之后引入,可以实现在 ViewGroup 动态添加或删除其中的控件时指定动画。动画可以自定义。对比前三种方法,LayoutTransition 是最强大的。
4.3.1 animateLayoutChanges 属性
在相应的 GroupView 子类中添加 android:animateLayoutChanges=”true”。
代码:
4.3.2 LayoutTransition
上面虽然在 ViewGroup 类控件 XML 中仅添加一行 android:animateLayoutChanges=[true] 即可实现内部控件添加删除时都加上动画效果。但却只能使用默认动画效果,而无法自定义动画。
为了能让我们自定义动画,谷歌在 API 11 时,同时为我们引入了一个类 LayoutTransaction。要使用LayoutTransaction是非常容易的,只需要三步:
在第二步中,transitioner.setAnimator 设置动画的函数声明为:
- int transitionType:表示当前应用动画的对象范围,取值有:
APPEARING:元素在容器中出现时所定义的动画。
DISAPPEARING:元素在容器中消失时所定义的动画。
CHANGE_APPEARING:由于容器中要显现一个新的元素,其它需要变化的元素所应用的动画。
CHANGE_DISAPPEARING:当容器中某个元素消失,其它需要变化的元素所应用的动画。 - Animator animator:表示当前所选范围的控件所使用的动画。
1. APPEARING 与 DISAPPEARING
LayoutTransition.APPEARING 所对应的当一个控件出现时所对应的动画;LayoutTransition.DISAPPEARING 在一个控件被移除时所对应的动画。修改上一个示例代码:
同时要删除 XML 中的 android:animateLayoutChanges=”true” 设置。
2. CHANGE_APPEARING
在添加控件时,除了被添加控件本身的入场动画以外,其它需要移动位置的控件,在移动位置时,也被添加上了动画(left 点位移动画),这些除了被添加控件以外的其它需要移动位置的控件组合,所对应的动画就是 LayoutTransition.CHANGE_APPEARING。同样,在移除一个控件时,其它所有需要改变位置的控件组合所对应的动画就是 LayoutTransition.CHANGE_DISAPPEARING。
注意:
1、LayoutTransition.CHANGE_APPEARING 和 LayoutTransition.CHANGE_DISAPPEARING 必须使用 PropertyValuesHolder 所构造的动画才会有效果,不然无效!也就是说使用 ObjectAnimator 构造的动画,在这里是不会有效果的!
2、在构造 PropertyValuesHolder 动画时,“left”、“top” 属性的变动是必写的。如果不需要变动,则直接写为:
3、在构造 PropertyValuesHolder 时,所使用的 ofInt、ofFloat 中的参数值,第一个值和最后一个值必须相同,不然此属性所对应的的动画将被放弃,在此属性值上将不会有效果。
4、在构造 PropertyValuesHolder 时,所使用的 ofInt,ofFloat 中,如果所有参数值都相同,也将不会有动画效果。
3. CHANGE_DISAPPEARING
|
|
第一步:由于 left、top 属性是必须的,但我们做响铃效果时,是不需要 left,top 变动的,所有给他们设置为无效值。
第二步:用 KeyFrame 构造 PropertyValuesHolder。
第三步:设置 LayoutTransition.CHANGE_DISAPPEARING 动画。
4.3.3 其他函数
1. 基本设置
|
|
2. LayoutTransition 设置监听
|
|
在 TransitionListener 中总共有四个参数:
- LayoutTransition transition:当前的 LayoutTransition 实例。
- ViewGroup container:当前应用 LayoutTransition 的 container。
- View view:当前在做动画的 View 对象。
- int transitionType:当前的 LayoutTransition 类型,取值有:APPEARING、DISAPPEARING、CHANGE_APPEARING、CHANGE_DISAPPEARING。
在添加控件时,先是 start 回调,再是 end 回调;APPEARING 事件所对应的 View 是控件,而 CHANGE_APPEARING 所对应的控件是容器。删除控件时,原理相同。
这是因为,在添加控件时,APPEARING 事件只针对当前被添加的控件做动画,所以返回的 View 是当前被添加的控件。而 CHANGE_APPEARING 是对容器中所有已存在的控件做动画,所以返回的 View 是容器。